<!DOCTYPE html>
<html lang="en"><head>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1"><!-- Begin Jekyll SEO tag v2.8.0 -->
<title>0040: Dialogs VI - The MessageDialog | gtkDcoding</title>
<meta name="generator" content="Jekyll v4.3.4" />
<meta property="og:title" content="0040: Dialogs VI - The MessageDialog" />
<meta name="author" content="Ron Tarrant" />
<meta property="og:locale" content="en_US" />
<meta name="description" content="Using a standard GTK MessageDialog; we also cover enum flag locations and inherited functions - a D-language tutorial." />
<meta property="og:description" content="Using a standard GTK MessageDialog; we also cover enum flag locations and inherited functions - a D-language tutorial." />
<link rel="canonical" href="http://localhost:4000/posts/0040-messagedialog.html" />
<meta property="og:url" content="http://localhost:4000/posts/0040-messagedialog.html" />
<meta property="og:site_name" content="gtkDcoding" />
<meta property="og:type" content="article" />
<meta property="article:published_time" content="2019-05-31T00:00:00-04:00" />
<meta name="twitter:card" content="summary" />
<meta property="twitter:title" content="0040: Dialogs VI - The MessageDialog" />
<script type="application/ld+json">
{"@context":"https://schema.org","@type":"BlogPosting","author":{"@type":"Person","name":"Ron Tarrant"},"dateModified":"2019-05-31T00:00:00-04:00","datePublished":"2019-05-31T00:00:00-04:00","description":"Using a standard GTK MessageDialog; we also cover enum flag locations and inherited functions - a D-language tutorial.","headline":"0040: Dialogs VI - The MessageDialog","mainEntityOfPage":{"@type":"WebPage","@id":"http://localhost:4000/posts/0040-messagedialog.html"},"url":"http://localhost:4000/posts/0040-messagedialog.html"}</script>
<!-- End Jekyll SEO tag -->
<link rel="stylesheet" href="../assets/main.css">
  <link rel="stylesheet" href="../css/style.css" /><link type="application/atom+xml" rel="alternate" href="http://localhost:4000/feed.xml" title="gtkDcoding" /></head>
<body><header class="site-header" role="banner">

  <div class="wrapper"><a class="site-title" rel="author" href="../">gtkDcoding</a><nav class="site-nav">
        <input type="checkbox" id="nav-trigger" class="nav-trigger" />
        <label for="nav-trigger">
          <span class="menu-icon">
            <svg viewBox="0 0 18 15" width="18px" height="15px">
              <path d="M18,1.484c0,0.82-0.665,1.484-1.484,1.484H1.484C0.665,2.969,0,2.304,0,1.484l0,0C0,0.665,0.665,0,1.484,0 h15.032C17.335,0,18,0.665,18,1.484L18,1.484z M18,7.516C18,8.335,17.335,9,16.516,9H1.484C0.665,9,0,8.335,0,7.516l0,0 c0-0.82,0.665-1.484,1.484-1.484h15.032C17.335,6.031,18,6.696,18,7.516L18,7.516z M18,13.516C18,14.335,17.335,15,16.516,15H1.484 C0.665,15,0,14.335,0,13.516l0,0c0-0.82,0.665-1.483,1.484-1.483h15.032C17.335,12.031,18,12.695,18,13.516L18,13.516z"/>
            </svg>
          </span>
        </label>

        <div class="trigger"><a class="page-link" href="../about.html">About</a><a class="page-link" href="../index-reverse.html">Posts in Date Order</a><a class="page-link" href="../topics.html">Blog Posts by Topic</a></div>
      </nav></div>
</header>
<main class="page-content" aria-label="Content">
      <div class="wrapper">
        <article class="post h-entry" itemscope itemtype="http://schema.org/BlogPosting">
	<header class="post-header">
		<link rel="stylesheet" href="../css/font_size.css" />
		<link rel="stylesheet" href="../css/figure.css" />
		<link rel="stylesheet" href="../css/topics/dialog.css" />  <!-- sub in the tag/topic -->
		<link rel="stylesheet" href="../css/modal.css" />
		<link rel="stylesheet" href="../css/post.css" />
		<link rel="stylesheet" href="../css/mascot_effects.css" />

		
		
		<p class="post-meta">
		<time class="dt-published" datetime="2019-05-31T00:00:00-04:00" itemprop="datePublished">Friday, May 31, 2019
		</time>• by <span itemprop="author" itemscope itemtype="http://schema.org/Person"><span class="p-author h-card" itemprop="name">Ron Tarrant</span></span></p>
	</header>

	<div class="post-content e-content" itemprop="articleBody">
		<div class="skew-line"></div>
		<h1 id="0040-dialogs-vi---the-messagedialog">0040: Dialogs VI - The MessageDialog</h1>

<div class="screenshot-frame">
   <div class="frame-header">
      Results of this example:
   </div>
   <div class="frame-screenshot">
      <figure>
         <img id="img0" src="../images/screenshots/013_dialogs/dialog_06.png" alt="Current example output" />      <!-- img# -->
         
			<!-- Modal for screenshot -->
			<div id="modal0" class="modal">																	<!-- modal# -->
				<span class="close0">&times;</span>															<!-- close# -->
				<img class="modal-content" id="img00" />															<!-- img## -->
				<div id="caption"></div>
			</div>
			
			<script>
			// Get the modal
			var modal = document.getElementById("modal0");														// modal#
			
			// Get the image and insert it inside the modal - use its "alt" text as a caption
			var img = document.getElementById("img0");															// img#
			var modalImg = document.getElementById("img00");													// img##
			var captionText = document.getElementById("caption");

			img.onclick = function()
			{
			  modal.style.display = "block";
			  modalImg.src = this.src;
			  captionText.innerHTML = this.alt;
			}
			
			// Get the <span> element that closes the modal
			var span = document.getElementsByClassName("close0")[0];											// close#
			
			// When the user clicks on <span> (x), close the modal
			span.onclick = function()
			{ 
				modal.style.display = "none";
			}
			</script>
			<figcaption>
			Current example output
			</figcaption>
		</figure>
	</div>

	<div class="frame-terminal">
		<figure class="right">
			<img id="img1" src="../images/screenshots/013_dialogs/dialog_06_term.png" alt="Current example terminal output" />		<!-- img#, filename -->

			<!-- Modal for terminal shot -->
			<div id="modal1" class="modal">																				<!-- modal# -->
				<span class="close1">&times;</span>																		<!-- close# -->
				<img class="modal-content" id="img11" />																		<!-- img## -->
				<div id="caption"></div>
			</div>
			
			<script>
			// Get the modal
			var modal = document.getElementById("modal1");																	// modal#
			
			// Get the image and insert it inside the modal - use its "alt" text as a caption
			var img = document.getElementById("img1");																		// img#
			var modalImg = document.getElementById("img11");																// img##
			var captionText = document.getElementById("caption");

			img.onclick = function()
			{
			  modal.style.display = "block";
			  modalImg.src = this.src;
			  captionText.innerHTML = this.alt;
			}
			
			// Get the <span> element that closes the modal
			var span = document.getElementsByClassName("close1")[0];														// close#
			
			// When the user clicks on <span> (x), close the modal
			span.onclick = function()
			{ 
				modal.style.display = "none";
			}
			</script>

			<figcaption>
				Current example terminal output (click for enlarged view)
			</figcaption>
		</figure>
	</div>

	<div class="frame-footer">																								<!-- ------------- filename (below) --------- -->
		The code file for this example is available <a href="https://github.com/rontarrant/gtkd_demos/blob/master/013_dialogs/dialog_06_message.d" target="_blank">here</a>.
	</div>
</div>

<p>As usual, take a gander at the import statements to see what’s changed there.</p>

<p>Most of the code in the example files, lately, has been support code, stuff needed so we can get at the topic of the day. Like this time, except for the <code class="language-plaintext highlighter-rouge">ClicheMessageDialog</code> (derived from <code class="language-plaintext highlighter-rouge">MessageDialog</code>) we’ve seen all this before, so let’s get right to the different bit:</p>

<div class="language-d highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="n">ClicheMessageDialog</span> <span class="p">:</span> <span class="n">MessageDialog</span>
<span class="p">{</span>
	<span class="n">GtkDialogFlags</span> <span class="n">flags</span> <span class="p">=</span> <span class="n">GtkDialogFlags</span><span class="p">.</span><span class="n">MODAL</span><span class="p">;</span>
	<span class="n">MessageType</span> <span class="n">messageType</span> <span class="p">=</span> <span class="n">MessageType</span><span class="p">.</span><span class="n">INFO</span><span class="p">;</span>
	<span class="n">ButtonsType</span> <span class="n">buttonType</span> <span class="p">=</span> <span class="n">ButtonsType</span><span class="p">.</span><span class="n">OK</span><span class="p">;</span>
	<span class="kt">int</span> <span class="n">responseID</span><span class="p">;</span>
	<span class="nb">string</span> <span class="n">messageText</span> <span class="p">=</span> <span class="s">"It was a cliché love triangle,\nIt was heaven on Earth, but with hell to pay.\nA cliché love triangle,\nThey're as common as dirt, or so they say,\nA cliché love triangle,\nHe went off half-cocked and got blown away."</span><span class="p">;</span>
</code></pre></div></div>

<h2 id="initializations">Initializations</h2>

<p>I’m going to do things a little out of order here. We’ll talk about those flags in a moment, but the rest of this section is straightforward. We’ve got a <code class="language-plaintext highlighter-rouge">responseID</code> which a <code class="language-plaintext highlighter-rouge">Dialog</code> always needs and the fairly long message to stuff into the <code class="language-plaintext highlighter-rouge">MessageDialog</code>.</p>

<h2 id="the-constructor">The Constructor</h2>

<div class="language-d highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">this</span><span class="p">(</span><span class="n">Window</span> <span class="n">_parentWindow</span><span class="p">)</span>
<span class="p">{</span>
	<span class="k">super</span><span class="p">(</span><span class="n">_parentWindow</span><span class="p">,</span> <span class="n">flags</span><span class="p">,</span> <span class="n">messageType</span><span class="p">,</span> <span class="n">buttonType</span><span class="p">,</span> <span class="n">messageText</span><span class="p">);</span>
	<span class="n">setTitle</span><span class="p">(</span><span class="s">"Alert the User:"</span><span class="p">);</span>
	<span class="n">setSizeRequest</span><span class="p">(</span><span class="mi">200</span><span class="p">,</span> <span class="mi">150</span><span class="p">);</span>
	<span class="n">addOnResponse</span><span class="p">(&amp;</span><span class="n">doSomething</span><span class="p">);</span>
	<span class="n">run</span><span class="p">();</span>
	<span class="n">destroy</span><span class="p">();</span>
	
<span class="p">}</span> <span class="c1">// this()</span>
</code></pre></div></div>

<p>Unlike the other <code class="language-plaintext highlighter-rouge">Dialog</code>s we’ve worked with so far, we’ve derived a new class and so the constructor passes the list of arguments to the super-class. I did it this way to cut back on cumbersome function calls to the <code class="language-plaintext highlighter-rouge">MessageDialog</code>. If we did this without the derived class, instead of <code class="language-plaintext highlighter-rouge">setTitle()</code>, <code class="language-plaintext highlighter-rouge">setSizeRequest()</code>, etc. we’d be calling <code class="language-plaintext highlighter-rouge">myMessageDialog.setTitle()</code>, yada-yada-yada.</p>

<p>The point is, because of the derivation, we can do all this stuff in the constructor.</p>

<h2 id="the-callback">The Callback</h2>

<div class="language-d highlighter-rouge"><div class="highlight"><pre class="highlight"><code>	<span class="kt">void</span> <span class="n">doSomething</span><span class="p">(</span><span class="kt">int</span> <span class="n">response</span><span class="p">,</span> <span class="n">Dialog</span> <span class="n">d</span><span class="p">)</span>
	<span class="p">{</span>
		<span class="n">writeln</span><span class="p">(</span><span class="s">"Dialog closed."</span><span class="p">);</span>
		
	<span class="p">}</span> <span class="c1">// doSomething()</span>
	
<span class="p">}</span> <span class="c1">// class ClicheMessageDialog</span>
</code></pre></div></div>

<p>Nothing really worth talking about here. We’ve been here, done that, and (I don’t know about you, but I’ve) got the T-shirt.</p>

<p>But now let’s backtrack and talk about…</p>

<h2 id="enum-constants-as-variables">enum Constants as Variables</h2>

<p>I just wanna take a moment to explain this flag business. More and more in our examples, there are flags used to control various features of a widget. In today’s example, we’ve got:</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">GtkDialogFlags.MODAL</code>, and</li>
  <li><code class="language-plaintext highlighter-rouge">MessageType.INFO</code>.</li>
</ul>

<h2 id="where-to-find-flags">Where to Find Flags</h2>

<p>If you need the names and values of these flags, you can find them in the generated wrapper code files spit out by the <em>GtkD</em> build script on <em>Windows</em> (following the local configuration guide in <a href="./0000-introduction-to-gtkDcoding.html">Blog Post #0000 – Introduction to gtkDcoding</a>) which is in a folder named <code class="language-plaintext highlighter-rouge">generated\gtkd</code>. Where these folders reside may depend on where you downloaded the <em>GtkD</em> package or where you unzipped it and ran the <code class="language-plaintext highlighter-rouge">Build.d</code> script.</p>

<p>On <em>Linux</em>,  if you followed the guide in <a href="./x0002-gtkd-in-a-linux-environment.html">Blog Post #X0002 - GtkD Linux Development Environment</a> you can find them in <code class="language-plaintext highlighter-rouge">/usr/include/dmd/gtkd3/gtk/c/types.d</code>.</p>

<p>That’s where the files will be found. More specifically, the flags are defined as enums in files (mostly) named types.d although some can be found in other wrapper code files named <code class="language-plaintext highlighter-rouge">XxxxXxxxT.d</code> or <code class="language-plaintext highlighter-rouge">XxxxxXxxxxIF.d</code> where <code class="language-plaintext highlighter-rouge">XxxxxXxxxx</code> is the camel-case name of a widget template or interface.</p>

<h2 id="how-to-initialize-an-enum-value-as-a-variable">How to Initialize an enum Value as a Variable</h2>

<p>If you’ve never done this before, it could be a bit of a head-scratcher, but once you know the technique, it ain’t no big deal.</p>

<p>My first thought was that an <code class="language-plaintext highlighter-rouge">enum</code> is an <code class="language-plaintext highlighter-rouge">int</code> type variable and ultimately, that may be so, but you don’t initialize them that way. Instead, you declare them using the name of the <code class="language-plaintext highlighter-rouge">enum</code>, like this:</p>

<div class="language-d highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">GtkDialogFlags</span> <span class="n">flags</span> <span class="p">=</span> <span class="n">GtkDialogFlags</span><span class="p">.</span><span class="n">MODAL</span><span class="p">;</span>
<span class="n">MessageType</span> <span class="n">messageType</span> <span class="p">=</span> <span class="n">MessageType</span><span class="p">.</span><span class="n">INFO</span><span class="p">;</span>
</code></pre></div></div>

<p>From there, you can use the <code class="language-plaintext highlighter-rouge">flags</code> and <code class="language-plaintext highlighter-rouge">messageType</code> variables the same way you use any other.</p>

<p>But another thing you may have noticed is that one of these <code class="language-plaintext highlighter-rouge">enum</code> types has a <code class="language-plaintext highlighter-rouge">Gtk</code> prefix while the other doesn’t. Turns out that every <code class="language-plaintext highlighter-rouge">enum</code> in every <code class="language-plaintext highlighter-rouge">types.d</code> file is defined as <code class="language-plaintext highlighter-rouge">GtkXxxxx</code>, or <code class="language-plaintext highlighter-rouge">GdkXxxxxx</code>, or <code class="language-plaintext highlighter-rouge">GioXxxxxx</code>, etc., but is also aliased to simply <code class="language-plaintext highlighter-rouge">Xxxxx</code>.</p>

<p>So in the above example where you see <code class="language-plaintext highlighter-rouge">GtkDialogFlags</code>, you could also use <code class="language-plaintext highlighter-rouge">DialogFlags</code> and get the same results.</p>

<p>And a note of caution: <code class="language-plaintext highlighter-rouge">GtkDialogFlags</code> and <code class="language-plaintext highlighter-rouge">GioDialogFlags</code> are both aliased to <code class="language-plaintext highlighter-rouge">DialogFlags</code>. If you find yourself in a situation where you need to use both within the same module, I’d suggest using their long forms instead of the aliases. Even if these are designed not to clash, it’ll help you keep them straight.</p>

<h2 id="inherited-functions">Inherited Functions</h2>

<p>Another thing I’ve been meaning to talk about for a while is function inheritance. When a class is derived from another, it naturally inherits all the functions of the parent class. If you take another look at the constructor, you’ll see several examples:</p>

<div class="language-d highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">this</span><span class="p">(</span><span class="n">Window</span> <span class="n">_parentWindow</span><span class="p">)</span>
<span class="p">{</span>
	<span class="k">super</span><span class="p">(</span><span class="n">_parentWindow</span><span class="p">,</span> <span class="n">flags</span><span class="p">,</span> <span class="n">messageType</span><span class="p">,</span> <span class="n">buttonType</span><span class="p">,</span> <span class="n">messageText</span><span class="p">);</span>
	<span class="n">setTitle</span><span class="p">(</span><span class="s">"Alert the User:"</span><span class="p">);</span>
	<span class="n">setSizeRequest</span><span class="p">(</span><span class="mi">200</span><span class="p">,</span> <span class="mi">150</span><span class="p">);</span>
	<span class="n">addOnResponse</span><span class="p">(&amp;</span><span class="n">doSomething</span><span class="p">);</span>
	<span class="n">run</span><span class="p">();</span>
	<span class="n">destroy</span><span class="p">();</span>
	
<span class="p">}</span> <span class="c1">// this()</span>
</code></pre></div></div>

<ul>
  <li><code class="language-plaintext highlighter-rouge">setTitle()</code> is inherited from the <code class="language-plaintext highlighter-rouge">Window</code> class,</li>
  <li><code class="language-plaintext highlighter-rouge">setSizeRequest()</code> – also from <code class="language-plaintext highlighter-rouge">Window</code>,</li>
  <li><code class="language-plaintext highlighter-rouge">addOnResponse()</code> comes from <code class="language-plaintext highlighter-rouge">Dialog</code>,</li>
  <li><code class="language-plaintext highlighter-rouge">run()</code> – also from <code class="language-plaintext highlighter-rouge">Dialog</code>, and</li>
  <li><code class="language-plaintext highlighter-rouge">destroy()</code> – again, from <code class="language-plaintext highlighter-rouge">Dialog</code>.</li>
</ul>

<p>Keep that in mind when you wanna do some extra little thing with a widget. Take a look at its inheritance and check out all the functions and signals available to the parent class. And if that doesn’t give you what you need, take a look at the parent’s inheritance and so on all the way back to <code class="language-plaintext highlighter-rouge">ObjectG</code>, the great-great-grandparent of them all.</p>

<h2 id="finding-a-widgets-family-tree">Finding a Widget’s Family Tree</h2>

<p>We talked earlier about a folder named <code class="language-plaintext highlighter-rouge">generated</code> and it’s sub-folder <code class="language-plaintext highlighter-rouge">gtkd</code> (or on <em>Linux</em>: <code class="language-plaintext highlighter-rouge">/usr/include/dmd/gtkd3/</code>) If you look at any of the wrapper modules found there, you’ll see something like (this is from <code class="language-plaintext highlighter-rouge">generated\gtkd\gtk\MessageDialog.d</code>):</p>

<div class="language-d highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="n">MessageDialog</span> <span class="p">:</span> <span class="n">Dialog</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">MessageDialog</code> inherits from <code class="language-plaintext highlighter-rouge">Dialog</code>. Now if you look at <code class="language-plaintext highlighter-rouge">Dialog.d</code>, you’ll see:</p>

<div class="language-d highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="n">Dialog</span> <span class="p">:</span> <span class="n">Window</span>
</code></pre></div></div>

<p>And in <code class="language-plaintext highlighter-rouge">Window.d</code>:</p>

<div class="language-d highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="n">Window</span> <span class="p">:</span> <span class="n">Bin</span>
</code></pre></div></div>

<p>And <code class="language-plaintext highlighter-rouge">Bin</code> inherits from <code class="language-plaintext highlighter-rouge">Container</code>, etc., etc. Thus you can trace your way back to <code class="language-plaintext highlighter-rouge">Widget</code> and you’ll then know all the most useful functions inherited from, and therefore usable as you write your code.</p>

<h2 id="conclusion">Conclusion</h2>

<p>And that’s it for yet another episode of <em>gtkDcoding</em>. Tune in next time when we’ll get into something I’m sure will wow you just as much as everything we covered today.</p>

<p>Bye, now.</p>

<div class="blog-nav">
	<div style="float: left;">
		<a href="./0039-file-save-as-dialog.html">Previous: SaveAs Dialog</a>
	</div>
	<div style="float: right;">
		<a href="./0041-colorchooserdialog.html">Next: ColorChooserDialog</a>
	</div>
</div>
<p>
	<h3></h3>
<div class="inpage-frame">
	<a href="https://github.com/sponsors/rontarrant">
		<BR>
		<BR>
		<B>Is this article useful? Educational? Entertaining, perhaps?</B>
		<BR>
		<figure class="left">
			<img src="../images/favorite_32.png" alt="Sponsorship heart" style="width: 32px; height: 32px;">
		</figure>
		You're free to accept or decline this invitation to become our newest sponsor.
	</a>
</div>
	<h4 class="comment-blurb"><B>Comments? Questions? Observations?</B></h4>
	<p>
		Did we miss a tidbit of information that would make this post even more informative? Let's talk about it in the comments.
	</p>
	<script src="https://utteranc.es/client.js"
		repo="rontarrant"
		issue-term="pathname"
		theme="github-light"
		crossorigin="anonymous"
		async>
	</script>
	<ul>
		<li> come on over to the <a href="https://forum.dlang.org/">D Language Forum</a> and look for one of the <i>gtkDcoding</i> announcement posts, </li>
		<li> drop by <a href="https://forum.gtkd.org/">the <i>GtkD Forum</i></a>,</li>
		<li> follow the link below to email me, or</li>
		<li> go to the	<a href="https://www.facebook.com">gtkDcoding Facebook page.</a></li>
	</ul>
</p>
<p> You can also subscribe <a href="/feed.xml">via RSS</a> so you won't miss anything. Thank you very much for dropping by.</p>
<p>&copy; Copyright 2025 Ron Tarrant </p>
</div>

	<a class="u-url" href="./0040-messagedialog.html" hidden></a>
</article>

      </div>
    </main><footer class="site-footer h-card">
  <data class="u-url" href="/"></data>

  <div class="wrapper">

    <h2 class="footer-heading">gtkDcoding</h2>

    <div class="footer-col-wrapper">
      <div class="footer-col footer-col-1">
        <ul class="contact-list">
          <li class="p-name">Ron Tarrant</li><li><a class="u-email" href="mailto:gtkDcoding@gmail.com">gtkDcoding@gmail.com</a></li></ul>
      </div>

      <div class="footer-col footer-col-2"><ul class="social-media-list"><li><a href="https://github.com/rontarrant"><svg class="svg-icon"><use xlink:href="../assets/minima-social-icons.svg#github"></use></svg> <span class="username">rontarrant</span></a></li></ul>
</div>

      <div class="footer-col footer-col-3">
        <p>Simple examples of how to use GtkD to build GUI applications.</p>
      </div>
    </div>

  </div>

</footer>
</body>

</html>
